#ifndef GY_TABLEVIEW_H
#define GY_TABLEVIEW_H

#include "GY_ControlLibrary_global.h"
#include <QTableView>
#include <QStandardItem>
#include <QStandardItemModel>
#include <QMouseEvent>
#include <QLineEdit>

/**
 * @brief The GY_TableView class
 * 自定义表控件类
 */
class GY_CONTROLLIBRARY_EXPORT GY_TableView:public QTableView
{
    Q_OBJECT
signals:
    /**
     * @brief controlClicked 表格内控件被点击发出的信号
     * @param row       被点击控件的行
     * @param column    被点击控件的列
     * @param data      被点击控件传出的数据
     */
    void controlClicked(int row,int column,QVariant data);
public:
    explicit GY_TableView(QWidget *parent = nullptr);
    //-------------------------列编辑接口--------------------------------
    /**
     * @brief setColumnCount 设置列数
     * @param columnCount 添加的列数
     */
    void setColumnCount(const int columnCount);
    /**
     * @brief addColumn 添加空白列
     * @param columnName 添加的列名
     */
    void addColumn(const QString &columnNmae);
    /**
     * @brief addColumnData 添加列数据
     * @param columnIndex 索引第几列
     * @param Data 要添加的数据
     */
    void addColumnData(const QString &columnNmae, const QVector<QVariant> &columnData);
    /**
     * @brief insterColumn 插入列
     * @param index 插入在第几列
     * @param columnName 插入的列名
     * @return 返回插入列是否成功
     */
    bool insterColumn(const int index, const QString &columnName);
    /**
     * @brief deleteColumn 删除列
     * @param index 删除的第几列
     * @return 返回删除列是否成功
     */
    bool deleteColumn(const int index);
    /**
     * @brief setColumnHeadName  设置列头名称
     * @param nameList  要修改的列名集
     */
    void setColumnHeadName(const QStringList &nameList);
    /**
     * @brief setColumnHeadName  修改某一列列名
     * @param index  要修改名字在第几列
     * @param headName  要修改成的名字
     */
    void setColumnHeadName(const int index,const QString &headName);
    /**
     * @brief getColumnData 获取列数据
     * @param columnIndex 索引第几列
     * @return 返回列数据
     */
    QVector<QVariant> getColumnData(const int columnIndex);

    //-------------------------行编辑接口--------------------------------
    /**
     * @brief addRowData 添加行
     * @param rowData 行数据
     * @return返回是否添加成功
     */
    bool addRowData(const QVector<QVariant> &rowData);
    /**
     * @brief insertRowData 插入行数据
     * @param rowIndex 插入第几行
     * @param rowData 插入的行数据
     * @return 是否插入成功
     */
    bool insertRowData(const int rowIndex, const QVector<QVariant> &rowData);
    /**
     * @brief deleteRow  删除指定行
     * @param rowIndex 删除第几行
     * @return 返回删除是否成功
     */
    bool deleteRow(const int rowIndex);
    /**
     * @brief setRowData  修改行数据
     * @param rowIndex 索引第几行
     * @param rowData  要修改的数据
     * @return 是否修改成功
     */
    bool setRowData(const int rowIndex, const QVector<QVariant>&rowData);
    /**
     * @brief setCellData  修改单元格数据
     * @param rowIndex 索引第几行
     * @param columnIndex  修改第几列
     * @param cellData  要修改的数据
     * @return 是否修改成功
     */
    bool setCellData(const int rowIndex, const int columnIndex, const QVariant &cellData);
    /**
     * @brief setData 设置单元格数据
     * @param rowIndex 索引第几行
     * @param columnIndex 修改第几列
     * @param role 数据对应枚举
     * @param cellData 要修改的数据
     * @return
     */
    bool setData(const int rowIndex, const int columnIndex, int role, const QVariant &cellData);
    /**
     * @brief getData 获取单元格数据
     * @param row 索引第几行
     * @param column 第几列
     * @param role 数据对应枚举
     * @return 数据
     */
    QVariant getData(const int row, const int column, int role);
    QVariant getText(const int row, const int column);
    bool setText(const int rowIndex, const int columnIndex, const QVariant &cell);
    /**
     * @brief getRowData 获取行数据
     * @param rowIndex 索引第几行
     * @return 返回行数据
     */
    QVector<QVariant> getRowData(const int rowIndex);

    QVariant getCellData(const int row, const int column);

    //-----------------------------选择接口------------------------------------------

    /**
     * @brief getSelectRowIndex  获取选择行index
     * @return  多选下返回选中的第一行
     */
    int getSelectRowIndex();

    //---------------------------编辑文字接口--------------------------------
    /**
     * @brief setTextLeft 设置文字居左显示
     * @param rowIndex 索引第几行
     */
    void setTextLeft(const int rowIndex);
    /**
     * @brief setTextRight 设置文字居右显示
     * @param rowIndex 索引第几行
     */
    void setTextRight(const int rowIndex);
    /**
     * @brief setTextCenter 设置文字居中显示
     * @param rowIndex 索引第几行
     */
    void setTextCenter(const int rowIndex);
    /**
     * @brief setTextBold 设置文字加粗显示
     * @param rowIndex 索引第几行
     */
    void setTextBold(const int rowIndex, bool ischeck);

    //-------------------------------控件接口------------------------------------
    /**
     * @brief setRowDropDownBox 设置行表格下拉框
     * @param rowIndex 索引第几行
     * @param data 下拉框中的数据
     */
    void setRowDropDownBox(const int rowIndex, const QStringList &data); //TODO
    /**
     * @brief setColumnDropDownBox 设置列表格下拉框
     * @param columnIndex 索引第几列
     * @param data 下拉框中的数据
     */
    void setColumnDropDownBox(const int columnIndex, const QStringList &data); //TODO
    /**
     * @brief setButton 设置表格按钮
     * @param roeIndex 索引第几行
     * @param columnIndex 索引第几列
     * @param data 按钮上的文字
     */
    void setButton(const int roeIndex, const int columnIndex, const QString &data, void (*callBack)(void)); //TODO

    //-------------------------------其他接口------------------------------------
    /**
     * @brief clearData 清除所有数据
     */
    void clearData();

    void setRowIndexIsEnabled(const int rowIndex, bool isEnabled);
    /**
     * @brief openCsv 打开Csv文件读取
     * @param data 文件名称
     */
    void openCsv(const QString &data); //TODO
    /**
     * @brief saveCsv 表格数据保存到csv
     * @param data 文件名称
     */
    void saveCsv(const QString &data); //TODO
    /**
     * @brief setColIsEditStatus 设置列的可编辑状态
     * @param list
     */
    void setColIsEditStatus(QList<bool> &list);

    void SlotClosePersistentEditor(); //关闭编辑框
    void setPersistentEditorColor(QColor color); //设置提示框颜色

    void setColumnEditedState(int column,bool isEdited);

private slots:
    /**
     * @brief ItemChanged 节点改变响应
     * @param pItem 节点
     */
    void ItemChanged(QStandardItem* pItem);
signals:
    void SendCloseLineEdit(const QModelIndex &index);
    void sendItemChangedData(const int &row,const int &column);
    void sendClickedBlackSig(QStandardItemModel *model);
protected:
    void mousePressEvent(QMouseEvent *event) override;
protected:
    //标准项目模型
    QStandardItemModel *m_pModel;
    //最后的索引
    QModelIndex m_lastIndex;
    //编辑框
    QLineEdit* m_pEditCell;
    //选中行号
    int m_currentRow;
    //选中列号
    int m_currentColumn;
    //设置列是否是可编辑状态
    QMap<int,bool> m_columnLineEditStateMap;
    //总列数
    int m_columnCount = 0;
    //总列数
    int m_rowCount = 0;
    //!列的可编辑状态
    QList<bool> colsEditStatus;
    //行索引是否能编辑
    QMap<int,bool> m_rowIndexIsEnabledMap;
    //旧名称
    QString m_oldName;
};

#endif // GY_TABLEVIEW_H
